/*
案例描述
  有5名选手：选手ABCDE，10个评委分别对每一名选手打分，去除最高分，去除评委中最低分，取平均分。
实现步骤
  创建五名选手，放到vector中
  遍历vector容器，取出来每一个选手，执行for循环，可以把10个评分打分存到deque容器中
  sort算法对deque容器中分数排序，去除最高和最低分
  deque容器遍历一遍，累加总分
  获取平均分
*/

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

class Person
{

public:
    Person(string name, int score) : m_name(name), m_score(score) {};

public:
    string m_name;
    int m_score;
};

void create_person(vector<Person> &v)
{
    string name_seed = "ABCDE";
    string prefix = "person";
    string name;
    int score;
    for (int i = 0; i < 5; i++)
    {
        name = prefix + name_seed[i];
        score = 0;
        Person p(name, score);
        v.push_back(p);
    }
}

void set_score(vector<Person> &v)
{
    for (vector<Person>::iterator vit = v.begin(); vit != v.end(); vit++)
    {
        // 将评委分数方法到deque中
        deque<int> d;
        for (int i = 0; i < 10; i++)
        {
            int score = rand() % 41 + 60; // 60 ~ 100
            d.push_back(score);
        }

        // 排序
        sort(d.begin(), d.end());

        // 去除最高和最低分
        d.pop_back();
        d.pop_front();

        // 求平均分
        int sum = 0;
        for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++)
            sum += *dit;
        int avg = sum / d.size();

        vit->m_score = avg;
    }
}

void show_score(vector<Person> &v)
{
    for (vector<Person>::iterator vit = v.begin(); vit != v.end(); vit++)
        cout << "person name: " << vit->m_name << " score: " << vit->m_score << endl;
}

int main()
{
    // 创建选手
    vector<Person> v;
    create_person(v);

    // 打分
    set_score(v);

    // 显示分数
    show_score(v);

    return 0;
}